/**
 * Config.h
 *
 * @author Bematech S.A.
 */

#ifndef __BILBAO_CONFIG_CLASS_H__
#define __BILBAO_CONFIG_CLASS_H__

#include "bilbao/types.h"
#include "bilbao/util/Blocker.h"
#include "bilbao/util/XmlUtils.h"
#include "bilbao/util/Timing.h"

namespace bilbao
{
	/**
	 * @brief <i>Singleton</i> responsável pelas configurações do equipamento SAT.
	 * Esta classe é responsável por executar as seguintes tarefas:
	 *
	 * - Criação de Diretórios;
	 * - Obtenção de parâmetros de Utilização;
	 * - Importação ed parâmetros de Ativação;
	 * - Importação ed parâmetros de Utilização;
	 * - Consulta de Status Operacional.
	 */
	class Config
	{
	public:

		/**
		 * Enum contendo os números relativos ao codigo das UFs baseado na
		 * tabela do IBGE.
		 */
		enum E_UFS
		{
			RONDONIA = 11,
			ACRE = 12,
			AMAZONAS = 13,
			RORAIMA = 14,
			PARA = 15,
			AMAPA = 16,
			TOCANTINS = 17,
			MARANHAO = 21,
			PIAUI = 22,
			CEARA = 23,
			RIO_GRANDE_DO_NORTE = 24,
			PARAIBA = 25,
			PERNAMBUCO = 26,
			ALAGOAS = 27,
			SERGIPE = 28,
			BAHIA = 29,
			MINAS_GERAIS = 31,
			ESPIRITO_SANTO = 32,
			RIO_DE_JANEIRO = 33,
			SAO_PAULO = 35,
			PARANA = 41,
			SANTA_CATARINA = 42,
			RIO_GRANDE_DO_SUL = 43,
			MATO_GROSSO_DO_SUL = 50,
			MATO_GROSSO = 51,
			GOISAS = 52,
			DISTRITO_FEDERAL = 53
		};

		/**
		 * TODO: Verificar números. Colocamos esses números apenas para testar.
		 * Enum para guardar os numeros do modelo do cupom fiscal.
		 */
		enum E_MODELS
		{
			MODEL59 = 59,
			MODEL02 = 2
		};

		/**
		 * Localiza a instância desta classe. Ou cria uma instância caso ainda
		 * não exista uma criada.
		 *
		 * @return Retorna a instância desta classe.
		 */
		static Config* getInstance( void );

		/**
		 * Cria os diretórios necessários de acordo com os arquivos de parametrização.
		 * Esses diretórios são criados através de comandos FTP.
		 */
		void createDirectories( void );

		/**
		 *
		 */
		bool getAutoBlocker(void);

		/**
		 *
		 */
		int getFactoryParameters( String& );

		/**
		 *
		 */
		int getActivationParameters( String& );

		/**
		 * Localiza o arquivo XML de parametrização de utilização.
		 *
		 * @return Retorna o arquivo XML de parametrização de utilização.
		 */
		int getUseParameters( String& );

		/**
		 * Localiza o número serial do equipamento no arquivo TODO:<Amanda>Qual arquivo de parametrização?</Amanda>.
		 * É passado a referência de uma <b>String</b> para recebê-lo.
		 *
		 * @param number - É utilizado para retornar o número serial do equipamento.
		 */
		String getSerialNumber( void ) const;

		/**
		 * Localiza o CNPJ do estabelecimento no arquivo TODO:<Amanda>Qual arquivo de parametrização?</Amanda>.
		 * É passado a referência de uma <b>String</b> para recebê-lo.
		 *
		 * @param cnpj - É utilizado para retornar o número serial do equipamento.
		 */
		String getCnpj( void );

		/**
		 * Localiza a UF ao qual o equipamento está atrelado
		 *
		 * @param uf - É utilizada para retornar o numero correspondente a Unidade Federativa
		 */
		String getUf( void );

		/**
		 *Pega o numero do modelo do cupom fiscal de acordo com o documento do SINIEF
		 *
		 *@param mod - É utilizada para retornar o numero do modelo do cupom fiscal
		 */
		String getModel( void );

		/**
		 * Importa o arquivo de Parametrização de Ativação.
		 *
		 * @param xml - XML do arquivo de Parametrização de Ativação.
		 */
		void importActivationParameters( const BilbaoXml& xml );

		/**
		 * Importa o arquivo de Configuração de interface de rede
		 *
		 * @param xml - XML do arquivo de configuração de interface de rede
		 */
		void importNetworkConfiguration(const BilbaoXml& xml);

		/**
		 * Configura a interface de rede
		 */
		void configureNetworkInterface(const String& xmlDoDadosDeVenda, DOMDocument* doc);

		/**
		 * Importa o arquivo de Parametrização de Utilização.
		 *
		 * @param xml - XML do arquivo de Parametrização de Utilização.
		 */
		void importUseParameters( const BilbaoXml& xml );

		/**
		 * 
		 */
		void importUfParameters( const BilbaoXml& xml );

		/**
		 *
		 */
		void importBlockerParameters( const BilbaoXml& xml );

		/**
		 *
		 */
		bool foundDataParameters( void );

		/**
		 * Verifica codigo de ativação com o codigo do banco
		 */
		bool verifyActivationCode( const String& actCode );

		/**
		 * Destrutor
		 */
		virtual ~Config( void );

	private:
		/**
		 * Instância da classe
		 */
		static Config* _instance;

		/**
		 * SerialNumber do equipamento
		 */
		String serialNumber;

		/**
		 * Construtor padrão
		 */
		Config( void );

		/**
		 * Operador de Cópia
		 */
		Config& operator=( const Config& rhs );

		/**
		 * Contrutor de Cópia
		 */
		Config( const Config& );

		/**
		 *
		 */
		DOMDocument* _doc;
	};

} //namespace bilbao

#endif //__BILBAO_CONFIG_CLASS_H__
